/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package logicanegocio;

import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entities.Resultado;
import entities.Fase;
import entities.Estadio;
import entities.Equipo;
import entities.JuezXPartido;
import java.util.ArrayList;
import java.util.List;
import entities.Precio;
import entities.Tarjeta;
import entities.Anotacion;
import entities.Sillaxpartido;
import entities.JugadorXPartido;
import entities.Partido;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import logicanegocio.exceptions.IllegalOrphanException;
import logicanegocio.exceptions.NonexistentEntityException;
import logicanegocio.exceptions.PreexistingEntityException;

/**
 *
 * @author Alejandro
 */
public class PartidoJpaController implements Serializable {

    public PartidoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Partido partido) throws PreexistingEntityException, Exception {
        if (partido.getJuezXPartidoList() == null) {
            partido.setJuezXPartidoList(new ArrayList<JuezXPartido>());
        }
        if (partido.getPrecioList() == null) {
            partido.setPrecioList(new ArrayList<Precio>());
        }
        if (partido.getTarjetaList() == null) {
            partido.setTarjetaList(new ArrayList<Tarjeta>());
        }
        if (partido.getAnotacionList() == null) {
            partido.setAnotacionList(new ArrayList<Anotacion>());
        }
        if (partido.getSillaxpartidoList() == null) {
            partido.setSillaxpartidoList(new ArrayList<Sillaxpartido>());
        }
        if (partido.getJugadorXPartidoList() == null) {
            partido.setJugadorXPartidoList(new ArrayList<JugadorXPartido>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Resultado resultado = partido.getResultado();
            if (resultado != null) {
                resultado = em.getReference(resultado.getClass(), resultado.getIdResultado());
                partido.setResultado(resultado);
            }
            Fase faseIdFase = partido.getFaseIdFase();
            if (faseIdFase != null) {
                faseIdFase = em.getReference(faseIdFase.getClass(), faseIdFase.getIdFase());
                partido.setFaseIdFase(faseIdFase);
            }
            Estadio estadioIdEstadio = partido.getEstadioIdEstadio();
            if (estadioIdEstadio != null) {
                estadioIdEstadio = em.getReference(estadioIdEstadio.getClass(), estadioIdEstadio.getIdEstadio());
                partido.setEstadioIdEstadio(estadioIdEstadio);
            }
            Equipo equipoIdEquipo = partido.getEquipoIdEquipo();
            if (equipoIdEquipo != null) {
                equipoIdEquipo = em.getReference(equipoIdEquipo.getClass(), equipoIdEquipo.getIdEquipo());
                partido.setEquipoIdEquipo(equipoIdEquipo);
            }
            Equipo equipoIdEquipo1 = partido.getEquipoIdEquipo1();
            if (equipoIdEquipo1 != null) {
                equipoIdEquipo1 = em.getReference(equipoIdEquipo1.getClass(), equipoIdEquipo1.getIdEquipo());
                partido.setEquipoIdEquipo1(equipoIdEquipo1);
            }
            List<JuezXPartido> attachedJuezXPartidoList = new ArrayList<JuezXPartido>();
            for (JuezXPartido juezXPartidoListJuezXPartidoToAttach : partido.getJuezXPartidoList()) {
                juezXPartidoListJuezXPartidoToAttach = em.getReference(juezXPartidoListJuezXPartidoToAttach.getClass(), juezXPartidoListJuezXPartidoToAttach.getJuezXPartidoPK());
                attachedJuezXPartidoList.add(juezXPartidoListJuezXPartidoToAttach);
            }
            partido.setJuezXPartidoList(attachedJuezXPartidoList);
            List<Precio> attachedPrecioList = new ArrayList<Precio>();
            for (Precio precioListPrecioToAttach : partido.getPrecioList()) {
                precioListPrecioToAttach = em.getReference(precioListPrecioToAttach.getClass(), precioListPrecioToAttach.getIdPrecio());
                attachedPrecioList.add(precioListPrecioToAttach);
            }
            partido.setPrecioList(attachedPrecioList);
            List<Tarjeta> attachedTarjetaList = new ArrayList<Tarjeta>();
            for (Tarjeta tarjetaListTarjetaToAttach : partido.getTarjetaList()) {
                tarjetaListTarjetaToAttach = em.getReference(tarjetaListTarjetaToAttach.getClass(), tarjetaListTarjetaToAttach.getIdEvento());
                attachedTarjetaList.add(tarjetaListTarjetaToAttach);
            }
            partido.setTarjetaList(attachedTarjetaList);
            List<Anotacion> attachedAnotacionList = new ArrayList<Anotacion>();
            for (Anotacion anotacionListAnotacionToAttach : partido.getAnotacionList()) {
                anotacionListAnotacionToAttach = em.getReference(anotacionListAnotacionToAttach.getClass(), anotacionListAnotacionToAttach.getIdEvento());
                attachedAnotacionList.add(anotacionListAnotacionToAttach);
            }
            partido.setAnotacionList(attachedAnotacionList);
            List<Sillaxpartido> attachedSillaxpartidoList = new ArrayList<Sillaxpartido>();
            for (Sillaxpartido sillaxpartidoListSillaxpartidoToAttach : partido.getSillaxpartidoList()) {
                sillaxpartidoListSillaxpartidoToAttach = em.getReference(sillaxpartidoListSillaxpartidoToAttach.getClass(), sillaxpartidoListSillaxpartidoToAttach.getSillaxpartidoPK());
                attachedSillaxpartidoList.add(sillaxpartidoListSillaxpartidoToAttach);
            }
            partido.setSillaxpartidoList(attachedSillaxpartidoList);
            List<JugadorXPartido> attachedJugadorXPartidoList = new ArrayList<JugadorXPartido>();
            for (JugadorXPartido jugadorXPartidoListJugadorXPartidoToAttach : partido.getJugadorXPartidoList()) {
                jugadorXPartidoListJugadorXPartidoToAttach = em.getReference(jugadorXPartidoListJugadorXPartidoToAttach.getClass(), jugadorXPartidoListJugadorXPartidoToAttach.getJugadorXPartidoPK());
                attachedJugadorXPartidoList.add(jugadorXPartidoListJugadorXPartidoToAttach);
            }
            partido.setJugadorXPartidoList(attachedJugadorXPartidoList);
            em.persist(partido);
            if (resultado != null) {
                Partido oldPartidoIdPartidoOfResultado = resultado.getPartidoIdPartido();
                if (oldPartidoIdPartidoOfResultado != null) {
                    oldPartidoIdPartidoOfResultado.setResultado(null);
                    oldPartidoIdPartidoOfResultado = em.merge(oldPartidoIdPartidoOfResultado);
                }
                resultado.setPartidoIdPartido(partido);
                resultado = em.merge(resultado);
            }
            if (faseIdFase != null) {
                faseIdFase.getPartidoList().add(partido);
                faseIdFase = em.merge(faseIdFase);
            }
            if (estadioIdEstadio != null) {
                estadioIdEstadio.getPartidoList().add(partido);
                estadioIdEstadio = em.merge(estadioIdEstadio);
            }
            if (equipoIdEquipo != null) {
                equipoIdEquipo.getPartidoList().add(partido);
                equipoIdEquipo = em.merge(equipoIdEquipo);
            }
            if (equipoIdEquipo1 != null) {
                equipoIdEquipo1.getPartidoList().add(partido);
                equipoIdEquipo1 = em.merge(equipoIdEquipo1);
            }
            for (JuezXPartido juezXPartidoListJuezXPartido : partido.getJuezXPartidoList()) {
                Partido oldPartidoOfJuezXPartidoListJuezXPartido = juezXPartidoListJuezXPartido.getPartido();
                juezXPartidoListJuezXPartido.setPartido(partido);
                juezXPartidoListJuezXPartido = em.merge(juezXPartidoListJuezXPartido);
                if (oldPartidoOfJuezXPartidoListJuezXPartido != null) {
                    oldPartidoOfJuezXPartidoListJuezXPartido.getJuezXPartidoList().remove(juezXPartidoListJuezXPartido);
                    oldPartidoOfJuezXPartidoListJuezXPartido = em.merge(oldPartidoOfJuezXPartidoListJuezXPartido);
                }
            }
            for (Precio precioListPrecio : partido.getPrecioList()) {
                Partido oldPartidoIdPartidoOfPrecioListPrecio = precioListPrecio.getPartidoIdPartido();
                precioListPrecio.setPartidoIdPartido(partido);
                precioListPrecio = em.merge(precioListPrecio);
                if (oldPartidoIdPartidoOfPrecioListPrecio != null) {
                    oldPartidoIdPartidoOfPrecioListPrecio.getPrecioList().remove(precioListPrecio);
                    oldPartidoIdPartidoOfPrecioListPrecio = em.merge(oldPartidoIdPartidoOfPrecioListPrecio);
                }
            }
            for (Tarjeta tarjetaListTarjeta : partido.getTarjetaList()) {
                Partido oldPartidoIdPartidoOfTarjetaListTarjeta = tarjetaListTarjeta.getPartidoIdPartido();
                tarjetaListTarjeta.setPartidoIdPartido(partido);
                tarjetaListTarjeta = em.merge(tarjetaListTarjeta);
                if (oldPartidoIdPartidoOfTarjetaListTarjeta != null) {
                    oldPartidoIdPartidoOfTarjetaListTarjeta.getTarjetaList().remove(tarjetaListTarjeta);
                    oldPartidoIdPartidoOfTarjetaListTarjeta = em.merge(oldPartidoIdPartidoOfTarjetaListTarjeta);
                }
            }
            for (Anotacion anotacionListAnotacion : partido.getAnotacionList()) {
                Partido oldPartidoIdPartidoOfAnotacionListAnotacion = anotacionListAnotacion.getPartidoIdPartido();
                anotacionListAnotacion.setPartidoIdPartido(partido);
                anotacionListAnotacion = em.merge(anotacionListAnotacion);
                if (oldPartidoIdPartidoOfAnotacionListAnotacion != null) {
                    oldPartidoIdPartidoOfAnotacionListAnotacion.getAnotacionList().remove(anotacionListAnotacion);
                    oldPartidoIdPartidoOfAnotacionListAnotacion = em.merge(oldPartidoIdPartidoOfAnotacionListAnotacion);
                }
            }
            for (Sillaxpartido sillaxpartidoListSillaxpartido : partido.getSillaxpartidoList()) {
                Partido oldPartidoOfSillaxpartidoListSillaxpartido = sillaxpartidoListSillaxpartido.getPartido();
                sillaxpartidoListSillaxpartido.setPartido(partido);
                sillaxpartidoListSillaxpartido = em.merge(sillaxpartidoListSillaxpartido);
                if (oldPartidoOfSillaxpartidoListSillaxpartido != null) {
                    oldPartidoOfSillaxpartidoListSillaxpartido.getSillaxpartidoList().remove(sillaxpartidoListSillaxpartido);
                    oldPartidoOfSillaxpartidoListSillaxpartido = em.merge(oldPartidoOfSillaxpartidoListSillaxpartido);
                }
            }
            for (JugadorXPartido jugadorXPartidoListJugadorXPartido : partido.getJugadorXPartidoList()) {
                Partido oldPartidoOfJugadorXPartidoListJugadorXPartido = jugadorXPartidoListJugadorXPartido.getPartido();
                jugadorXPartidoListJugadorXPartido.setPartido(partido);
                jugadorXPartidoListJugadorXPartido = em.merge(jugadorXPartidoListJugadorXPartido);
                if (oldPartidoOfJugadorXPartidoListJugadorXPartido != null) {
                    oldPartidoOfJugadorXPartidoListJugadorXPartido.getJugadorXPartidoList().remove(jugadorXPartidoListJugadorXPartido);
                    oldPartidoOfJugadorXPartidoListJugadorXPartido = em.merge(oldPartidoOfJugadorXPartidoListJugadorXPartido);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findPartido(partido.getIdPartido()) != null) {
                throw new PreexistingEntityException("Partido " + partido + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Partido partido) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Partido persistentPartido = em.find(Partido.class, partido.getIdPartido());
            Resultado resultadoOld = persistentPartido.getResultado();
            Resultado resultadoNew = partido.getResultado();
            Fase faseIdFaseOld = persistentPartido.getFaseIdFase();
            Fase faseIdFaseNew = partido.getFaseIdFase();
            Estadio estadioIdEstadioOld = persistentPartido.getEstadioIdEstadio();
            Estadio estadioIdEstadioNew = partido.getEstadioIdEstadio();
            Equipo equipoIdEquipoOld = persistentPartido.getEquipoIdEquipo();
            Equipo equipoIdEquipoNew = partido.getEquipoIdEquipo();
            Equipo equipoIdEquipo1Old = persistentPartido.getEquipoIdEquipo1();
            Equipo equipoIdEquipo1New = partido.getEquipoIdEquipo1();
            List<JuezXPartido> juezXPartidoListOld = persistentPartido.getJuezXPartidoList();
            List<JuezXPartido> juezXPartidoListNew = partido.getJuezXPartidoList();
            List<Precio> precioListOld = persistentPartido.getPrecioList();
            List<Precio> precioListNew = partido.getPrecioList();
            List<Tarjeta> tarjetaListOld = persistentPartido.getTarjetaList();
            List<Tarjeta> tarjetaListNew = partido.getTarjetaList();
            List<Anotacion> anotacionListOld = persistentPartido.getAnotacionList();
            List<Anotacion> anotacionListNew = partido.getAnotacionList();
            List<Sillaxpartido> sillaxpartidoListOld = persistentPartido.getSillaxpartidoList();
            List<Sillaxpartido> sillaxpartidoListNew = partido.getSillaxpartidoList();
            List<JugadorXPartido> jugadorXPartidoListOld = persistentPartido.getJugadorXPartidoList();
            List<JugadorXPartido> jugadorXPartidoListNew = partido.getJugadorXPartidoList();
            List<String> illegalOrphanMessages = null;
            if (resultadoOld != null && !resultadoOld.equals(resultadoNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Resultado " + resultadoOld + " since its partidoIdPartido field is not nullable.");
            }
            for (JuezXPartido juezXPartidoListOldJuezXPartido : juezXPartidoListOld) {
                if (!juezXPartidoListNew.contains(juezXPartidoListOldJuezXPartido)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain JuezXPartido " + juezXPartidoListOldJuezXPartido + " since its partido field is not nullable.");
                }
            }
            for (Precio precioListOldPrecio : precioListOld) {
                if (!precioListNew.contains(precioListOldPrecio)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Precio " + precioListOldPrecio + " since its partidoIdPartido field is not nullable.");
                }
            }
            for (Tarjeta tarjetaListOldTarjeta : tarjetaListOld) {
                if (!tarjetaListNew.contains(tarjetaListOldTarjeta)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Tarjeta " + tarjetaListOldTarjeta + " since its partidoIdPartido field is not nullable.");
                }
            }
            for (Anotacion anotacionListOldAnotacion : anotacionListOld) {
                if (!anotacionListNew.contains(anotacionListOldAnotacion)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Anotacion " + anotacionListOldAnotacion + " since its partidoIdPartido field is not nullable.");
                }
            }
            for (Sillaxpartido sillaxpartidoListOldSillaxpartido : sillaxpartidoListOld) {
                if (!sillaxpartidoListNew.contains(sillaxpartidoListOldSillaxpartido)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Sillaxpartido " + sillaxpartidoListOldSillaxpartido + " since its partido field is not nullable.");
                }
            }
            for (JugadorXPartido jugadorXPartidoListOldJugadorXPartido : jugadorXPartidoListOld) {
                if (!jugadorXPartidoListNew.contains(jugadorXPartidoListOldJugadorXPartido)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain JugadorXPartido " + jugadorXPartidoListOldJugadorXPartido + " since its partido field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (resultadoNew != null) {
                resultadoNew = em.getReference(resultadoNew.getClass(), resultadoNew.getIdResultado());
                partido.setResultado(resultadoNew);
            }
            if (faseIdFaseNew != null) {
                faseIdFaseNew = em.getReference(faseIdFaseNew.getClass(), faseIdFaseNew.getIdFase());
                partido.setFaseIdFase(faseIdFaseNew);
            }
            if (estadioIdEstadioNew != null) {
                estadioIdEstadioNew = em.getReference(estadioIdEstadioNew.getClass(), estadioIdEstadioNew.getIdEstadio());
                partido.setEstadioIdEstadio(estadioIdEstadioNew);
            }
            if (equipoIdEquipoNew != null) {
                equipoIdEquipoNew = em.getReference(equipoIdEquipoNew.getClass(), equipoIdEquipoNew.getIdEquipo());
                partido.setEquipoIdEquipo(equipoIdEquipoNew);
            }
            if (equipoIdEquipo1New != null) {
                equipoIdEquipo1New = em.getReference(equipoIdEquipo1New.getClass(), equipoIdEquipo1New.getIdEquipo());
                partido.setEquipoIdEquipo1(equipoIdEquipo1New);
            }
            List<JuezXPartido> attachedJuezXPartidoListNew = new ArrayList<JuezXPartido>();
            for (JuezXPartido juezXPartidoListNewJuezXPartidoToAttach : juezXPartidoListNew) {
                juezXPartidoListNewJuezXPartidoToAttach = em.getReference(juezXPartidoListNewJuezXPartidoToAttach.getClass(), juezXPartidoListNewJuezXPartidoToAttach.getJuezXPartidoPK());
                attachedJuezXPartidoListNew.add(juezXPartidoListNewJuezXPartidoToAttach);
            }
            juezXPartidoListNew = attachedJuezXPartidoListNew;
            partido.setJuezXPartidoList(juezXPartidoListNew);
            List<Precio> attachedPrecioListNew = new ArrayList<Precio>();
            for (Precio precioListNewPrecioToAttach : precioListNew) {
                precioListNewPrecioToAttach = em.getReference(precioListNewPrecioToAttach.getClass(), precioListNewPrecioToAttach.getIdPrecio());
                attachedPrecioListNew.add(precioListNewPrecioToAttach);
            }
            precioListNew = attachedPrecioListNew;
            partido.setPrecioList(precioListNew);
            List<Tarjeta> attachedTarjetaListNew = new ArrayList<Tarjeta>();
            for (Tarjeta tarjetaListNewTarjetaToAttach : tarjetaListNew) {
                tarjetaListNewTarjetaToAttach = em.getReference(tarjetaListNewTarjetaToAttach.getClass(), tarjetaListNewTarjetaToAttach.getIdEvento());
                attachedTarjetaListNew.add(tarjetaListNewTarjetaToAttach);
            }
            tarjetaListNew = attachedTarjetaListNew;
            partido.setTarjetaList(tarjetaListNew);
            List<Anotacion> attachedAnotacionListNew = new ArrayList<Anotacion>();
            for (Anotacion anotacionListNewAnotacionToAttach : anotacionListNew) {
                anotacionListNewAnotacionToAttach = em.getReference(anotacionListNewAnotacionToAttach.getClass(), anotacionListNewAnotacionToAttach.getIdEvento());
                attachedAnotacionListNew.add(anotacionListNewAnotacionToAttach);
            }
            anotacionListNew = attachedAnotacionListNew;
            partido.setAnotacionList(anotacionListNew);
            List<Sillaxpartido> attachedSillaxpartidoListNew = new ArrayList<Sillaxpartido>();
            for (Sillaxpartido sillaxpartidoListNewSillaxpartidoToAttach : sillaxpartidoListNew) {
                sillaxpartidoListNewSillaxpartidoToAttach = em.getReference(sillaxpartidoListNewSillaxpartidoToAttach.getClass(), sillaxpartidoListNewSillaxpartidoToAttach.getSillaxpartidoPK());
                attachedSillaxpartidoListNew.add(sillaxpartidoListNewSillaxpartidoToAttach);
            }
            sillaxpartidoListNew = attachedSillaxpartidoListNew;
            partido.setSillaxpartidoList(sillaxpartidoListNew);
            List<JugadorXPartido> attachedJugadorXPartidoListNew = new ArrayList<JugadorXPartido>();
            for (JugadorXPartido jugadorXPartidoListNewJugadorXPartidoToAttach : jugadorXPartidoListNew) {
                jugadorXPartidoListNewJugadorXPartidoToAttach = em.getReference(jugadorXPartidoListNewJugadorXPartidoToAttach.getClass(), jugadorXPartidoListNewJugadorXPartidoToAttach.getJugadorXPartidoPK());
                attachedJugadorXPartidoListNew.add(jugadorXPartidoListNewJugadorXPartidoToAttach);
            }
            jugadorXPartidoListNew = attachedJugadorXPartidoListNew;
            partido.setJugadorXPartidoList(jugadorXPartidoListNew);
            partido = em.merge(partido);
            if (resultadoNew != null && !resultadoNew.equals(resultadoOld)) {
                Partido oldPartidoIdPartidoOfResultado = resultadoNew.getPartidoIdPartido();
                if (oldPartidoIdPartidoOfResultado != null) {
                    oldPartidoIdPartidoOfResultado.setResultado(null);
                    oldPartidoIdPartidoOfResultado = em.merge(oldPartidoIdPartidoOfResultado);
                }
                resultadoNew.setPartidoIdPartido(partido);
                resultadoNew = em.merge(resultadoNew);
            }
            if (faseIdFaseOld != null && !faseIdFaseOld.equals(faseIdFaseNew)) {
                faseIdFaseOld.getPartidoList().remove(partido);
                faseIdFaseOld = em.merge(faseIdFaseOld);
            }
            if (faseIdFaseNew != null && !faseIdFaseNew.equals(faseIdFaseOld)) {
                faseIdFaseNew.getPartidoList().add(partido);
                faseIdFaseNew = em.merge(faseIdFaseNew);
            }
            if (estadioIdEstadioOld != null && !estadioIdEstadioOld.equals(estadioIdEstadioNew)) {
                estadioIdEstadioOld.getPartidoList().remove(partido);
                estadioIdEstadioOld = em.merge(estadioIdEstadioOld);
            }
            if (estadioIdEstadioNew != null && !estadioIdEstadioNew.equals(estadioIdEstadioOld)) {
                estadioIdEstadioNew.getPartidoList().add(partido);
                estadioIdEstadioNew = em.merge(estadioIdEstadioNew);
            }
            if (equipoIdEquipoOld != null && !equipoIdEquipoOld.equals(equipoIdEquipoNew)) {
                equipoIdEquipoOld.getPartidoList().remove(partido);
                equipoIdEquipoOld = em.merge(equipoIdEquipoOld);
            }
            if (equipoIdEquipoNew != null && !equipoIdEquipoNew.equals(equipoIdEquipoOld)) {
                equipoIdEquipoNew.getPartidoList().add(partido);
                equipoIdEquipoNew = em.merge(equipoIdEquipoNew);
            }
            if (equipoIdEquipo1Old != null && !equipoIdEquipo1Old.equals(equipoIdEquipo1New)) {
                equipoIdEquipo1Old.getPartidoList().remove(partido);
                equipoIdEquipo1Old = em.merge(equipoIdEquipo1Old);
            }
            if (equipoIdEquipo1New != null && !equipoIdEquipo1New.equals(equipoIdEquipo1Old)) {
                equipoIdEquipo1New.getPartidoList().add(partido);
                equipoIdEquipo1New = em.merge(equipoIdEquipo1New);
            }
            for (JuezXPartido juezXPartidoListNewJuezXPartido : juezXPartidoListNew) {
                if (!juezXPartidoListOld.contains(juezXPartidoListNewJuezXPartido)) {
                    Partido oldPartidoOfJuezXPartidoListNewJuezXPartido = juezXPartidoListNewJuezXPartido.getPartido();
                    juezXPartidoListNewJuezXPartido.setPartido(partido);
                    juezXPartidoListNewJuezXPartido = em.merge(juezXPartidoListNewJuezXPartido);
                    if (oldPartidoOfJuezXPartidoListNewJuezXPartido != null && !oldPartidoOfJuezXPartidoListNewJuezXPartido.equals(partido)) {
                        oldPartidoOfJuezXPartidoListNewJuezXPartido.getJuezXPartidoList().remove(juezXPartidoListNewJuezXPartido);
                        oldPartidoOfJuezXPartidoListNewJuezXPartido = em.merge(oldPartidoOfJuezXPartidoListNewJuezXPartido);
                    }
                }
            }
            for (Precio precioListNewPrecio : precioListNew) {
                if (!precioListOld.contains(precioListNewPrecio)) {
                    Partido oldPartidoIdPartidoOfPrecioListNewPrecio = precioListNewPrecio.getPartidoIdPartido();
                    precioListNewPrecio.setPartidoIdPartido(partido);
                    precioListNewPrecio = em.merge(precioListNewPrecio);
                    if (oldPartidoIdPartidoOfPrecioListNewPrecio != null && !oldPartidoIdPartidoOfPrecioListNewPrecio.equals(partido)) {
                        oldPartidoIdPartidoOfPrecioListNewPrecio.getPrecioList().remove(precioListNewPrecio);
                        oldPartidoIdPartidoOfPrecioListNewPrecio = em.merge(oldPartidoIdPartidoOfPrecioListNewPrecio);
                    }
                }
            }
            for (Tarjeta tarjetaListNewTarjeta : tarjetaListNew) {
                if (!tarjetaListOld.contains(tarjetaListNewTarjeta)) {
                    Partido oldPartidoIdPartidoOfTarjetaListNewTarjeta = tarjetaListNewTarjeta.getPartidoIdPartido();
                    tarjetaListNewTarjeta.setPartidoIdPartido(partido);
                    tarjetaListNewTarjeta = em.merge(tarjetaListNewTarjeta);
                    if (oldPartidoIdPartidoOfTarjetaListNewTarjeta != null && !oldPartidoIdPartidoOfTarjetaListNewTarjeta.equals(partido)) {
                        oldPartidoIdPartidoOfTarjetaListNewTarjeta.getTarjetaList().remove(tarjetaListNewTarjeta);
                        oldPartidoIdPartidoOfTarjetaListNewTarjeta = em.merge(oldPartidoIdPartidoOfTarjetaListNewTarjeta);
                    }
                }
            }
            for (Anotacion anotacionListNewAnotacion : anotacionListNew) {
                if (!anotacionListOld.contains(anotacionListNewAnotacion)) {
                    Partido oldPartidoIdPartidoOfAnotacionListNewAnotacion = anotacionListNewAnotacion.getPartidoIdPartido();
                    anotacionListNewAnotacion.setPartidoIdPartido(partido);
                    anotacionListNewAnotacion = em.merge(anotacionListNewAnotacion);
                    if (oldPartidoIdPartidoOfAnotacionListNewAnotacion != null && !oldPartidoIdPartidoOfAnotacionListNewAnotacion.equals(partido)) {
                        oldPartidoIdPartidoOfAnotacionListNewAnotacion.getAnotacionList().remove(anotacionListNewAnotacion);
                        oldPartidoIdPartidoOfAnotacionListNewAnotacion = em.merge(oldPartidoIdPartidoOfAnotacionListNewAnotacion);
                    }
                }
            }
            for (Sillaxpartido sillaxpartidoListNewSillaxpartido : sillaxpartidoListNew) {
                if (!sillaxpartidoListOld.contains(sillaxpartidoListNewSillaxpartido)) {
                    Partido oldPartidoOfSillaxpartidoListNewSillaxpartido = sillaxpartidoListNewSillaxpartido.getPartido();
                    sillaxpartidoListNewSillaxpartido.setPartido(partido);
                    sillaxpartidoListNewSillaxpartido = em.merge(sillaxpartidoListNewSillaxpartido);
                    if (oldPartidoOfSillaxpartidoListNewSillaxpartido != null && !oldPartidoOfSillaxpartidoListNewSillaxpartido.equals(partido)) {
                        oldPartidoOfSillaxpartidoListNewSillaxpartido.getSillaxpartidoList().remove(sillaxpartidoListNewSillaxpartido);
                        oldPartidoOfSillaxpartidoListNewSillaxpartido = em.merge(oldPartidoOfSillaxpartidoListNewSillaxpartido);
                    }
                }
            }
            for (JugadorXPartido jugadorXPartidoListNewJugadorXPartido : jugadorXPartidoListNew) {
                if (!jugadorXPartidoListOld.contains(jugadorXPartidoListNewJugadorXPartido)) {
                    Partido oldPartidoOfJugadorXPartidoListNewJugadorXPartido = jugadorXPartidoListNewJugadorXPartido.getPartido();
                    jugadorXPartidoListNewJugadorXPartido.setPartido(partido);
                    jugadorXPartidoListNewJugadorXPartido = em.merge(jugadorXPartidoListNewJugadorXPartido);
                    if (oldPartidoOfJugadorXPartidoListNewJugadorXPartido != null && !oldPartidoOfJugadorXPartidoListNewJugadorXPartido.equals(partido)) {
                        oldPartidoOfJugadorXPartidoListNewJugadorXPartido.getJugadorXPartidoList().remove(jugadorXPartidoListNewJugadorXPartido);
                        oldPartidoOfJugadorXPartidoListNewJugadorXPartido = em.merge(oldPartidoOfJugadorXPartidoListNewJugadorXPartido);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                BigDecimal id = partido.getIdPartido();
                if (findPartido(id) == null) {
                    throw new NonexistentEntityException("The partido with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(BigDecimal id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Partido partido;
            try {
                partido = em.getReference(Partido.class, id);
                partido.getIdPartido();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The partido with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Resultado resultadoOrphanCheck = partido.getResultado();
            if (resultadoOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Partido (" + partido + ") cannot be destroyed since the Resultado " + resultadoOrphanCheck + " in its resultado field has a non-nullable partidoIdPartido field.");
            }
            List<JuezXPartido> juezXPartidoListOrphanCheck = partido.getJuezXPartidoList();
            for (JuezXPartido juezXPartidoListOrphanCheckJuezXPartido : juezXPartidoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Partido (" + partido + ") cannot be destroyed since the JuezXPartido " + juezXPartidoListOrphanCheckJuezXPartido + " in its juezXPartidoList field has a non-nullable partido field.");
            }
            List<Precio> precioListOrphanCheck = partido.getPrecioList();
            for (Precio precioListOrphanCheckPrecio : precioListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Partido (" + partido + ") cannot be destroyed since the Precio " + precioListOrphanCheckPrecio + " in its precioList field has a non-nullable partidoIdPartido field.");
            }
            List<Tarjeta> tarjetaListOrphanCheck = partido.getTarjetaList();
            for (Tarjeta tarjetaListOrphanCheckTarjeta : tarjetaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Partido (" + partido + ") cannot be destroyed since the Tarjeta " + tarjetaListOrphanCheckTarjeta + " in its tarjetaList field has a non-nullable partidoIdPartido field.");
            }
            List<Anotacion> anotacionListOrphanCheck = partido.getAnotacionList();
            for (Anotacion anotacionListOrphanCheckAnotacion : anotacionListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Partido (" + partido + ") cannot be destroyed since the Anotacion " + anotacionListOrphanCheckAnotacion + " in its anotacionList field has a non-nullable partidoIdPartido field.");
            }
            List<Sillaxpartido> sillaxpartidoListOrphanCheck = partido.getSillaxpartidoList();
            for (Sillaxpartido sillaxpartidoListOrphanCheckSillaxpartido : sillaxpartidoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Partido (" + partido + ") cannot be destroyed since the Sillaxpartido " + sillaxpartidoListOrphanCheckSillaxpartido + " in its sillaxpartidoList field has a non-nullable partido field.");
            }
            List<JugadorXPartido> jugadorXPartidoListOrphanCheck = partido.getJugadorXPartidoList();
            for (JugadorXPartido jugadorXPartidoListOrphanCheckJugadorXPartido : jugadorXPartidoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Partido (" + partido + ") cannot be destroyed since the JugadorXPartido " + jugadorXPartidoListOrphanCheckJugadorXPartido + " in its jugadorXPartidoList field has a non-nullable partido field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Fase faseIdFase = partido.getFaseIdFase();
            if (faseIdFase != null) {
                faseIdFase.getPartidoList().remove(partido);
                faseIdFase = em.merge(faseIdFase);
            }
            Estadio estadioIdEstadio = partido.getEstadioIdEstadio();
            if (estadioIdEstadio != null) {
                estadioIdEstadio.getPartidoList().remove(partido);
                estadioIdEstadio = em.merge(estadioIdEstadio);
            }
            Equipo equipoIdEquipo = partido.getEquipoIdEquipo();
            if (equipoIdEquipo != null) {
                equipoIdEquipo.getPartidoList().remove(partido);
                equipoIdEquipo = em.merge(equipoIdEquipo);
            }
            Equipo equipoIdEquipo1 = partido.getEquipoIdEquipo1();
            if (equipoIdEquipo1 != null) {
                equipoIdEquipo1.getPartidoList().remove(partido);
                equipoIdEquipo1 = em.merge(equipoIdEquipo1);
            }
            em.remove(partido);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Partido> findPartidoEntities() {
        return findPartidoEntities(true, -1, -1);
    }

    public List<Partido> findPartidoEntities(int maxResults, int firstResult) {
        return findPartidoEntities(false, maxResults, firstResult);
    }

    private List<Partido> findPartidoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Partido.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Partido findPartido(BigDecimal id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Partido.class, id);
        } finally {
            em.close();
        }
    }

    public int getPartidoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Partido> rt = cq.from(Partido.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

    public List<Partido> findPartidosMayorAFecha(Date fechaActual, String fase) {
        EntityManager em = getEntityManager();
        SimpleDateFormat dateToFecha = new SimpleDateFormat("dd/MM/yyyy");
        try {
            Query query = em.createNativeQuery("SELECT * FROM PARTIDO"
                    + " WHERE FECHA >= TO_DATE(? , 'dd/mm/yyyy') AND FASE_ID_FASE = ?",
                    Partido.class);
            query.setParameter(1, "28/06/2014");
            //query.setParameter(1, dateToFecha.format(fechaActual));
            query.setParameter(2, fase);
            List<Partido> listPartidos = query.getResultList();
            return listPartidos;
        } finally {
            em.close();
        }
    }

    public BigDecimal getEntradasDispPartido(BigDecimal idPartido, BigDecimal idEstadio) {
        EntityManager em = getEntityManager();
        try {
            Query query = em.createNativeQuery(
            "WITH NUMSILLASEST AS (SELECT count(*) AS NUMS FROM SILLA "+
                                   "WHERE SILLA.CATEGORIA_ESTADIO_ID_ESTADIO = ?), "+  
            "NUMOCUPADAS AS (SELECT count(*) AS NUMO FROM SILLAXPARTIDO S "+
                             "WHERE S.PARTIDO_ID_PARTIDO = ?) " +
            "SELECT (NUMSILLASEST.NUMS-NUMOCUPADAS.NUMO) AS TOTAL FROM NUMSILLASEST, NUMOCUPADAS");
            query.setParameter(1, idEstadio.toString());
            query.setParameter(2, idPartido.toString());
            BigDecimal total = (BigDecimal) query.getSingleResult();
            return total;
        } finally {
            em.close();
        }
    }

    public List<Sillaxpartido> getSillasOcupadasXPartido(BigDecimal idPartido, String cat) {
       EntityManager em = getEntityManager();
        try {
            Query query = em.createNativeQuery("SELECT * FROM SILLAXPARTIDO " +
                                "WHERE PARTIDO_ID_PARTIDO = ? AND SILLA_CAT_ID_CATEGORIA = ?",
                    Sillaxpartido.class);
            query.setParameter(1, idPartido.toString());
            query.setParameter(2, cat);            
            List<Sillaxpartido> listSilla = query.getResultList();
            return listSilla;
        } finally {
            em.close();
        } 
    }
    
}
